﻿using System;
using Database.Context;
using Model = Database.Models;
using QuanLyThongTinCoSo.BaseForm;
using QuanLyThongTinCoSo.Biz;
using QuanLyThongTinCoSo.Common;

namespace QuanLyThongTinCoSo.Forms.User
{
    public partial class frmUserDetail : frmDetail
    {
        private int userId;

        public frmUserDetail()
        {
            InitializeComponent();

            txtUsername.Focus();

            Text = @"Thêm mới người dùng";

            LoadRoles();
        }

        public frmUserDetail(int id)
        {
            InitializeComponent();

            txtUsername.Focus();

            Text = @"Sửa thông tin người dùng";

            LoadRoles();

            _fromtype = Constant.TypeForm.Edit;
            userId = id;

            var userBiz = new UserBiz();
            var model = userBiz.GetItemById(id) as Model.User;

            if (model == null) return;

            txtUsername.Text = model.Username;
            txtFullName.Text = model.FullName;

            cblRoles.ClearSelected();

            foreach (var role in model.Roles)
            {
                int index = cblRoles.FindStringExact(role.RoleName);
                if (index > -1)
                {
                    cblRoles.SetItemChecked(index, true);
                }
            }
        }

        #region Validation

        protected override bool Validation()
        {
            bool flag;

            errorProvider.Dispose();
            if (txtUsername.Text == "")
            {
                errorProvider.SetError(txtUsername, "Bạn chưa nhập username. Xin vui lòng kiểm tra lại");
                flag = false;
            }
            else
            {
                if (txtFullName.Text == "")
                {
                    errorProvider.SetError(txtFullName, "Bạn chưa nhập họ và tên cán bộ. Xin vui lòng kiểm tra lại");
                    flag = false;
                }
                else
                {
                    if (cblRoles.CheckedItems.Count == 0)
                    {
                        errorProvider.SetError(cblRoles, "Bạn chưa chọn quyền sử dụng cán bộ. Xin vui lòng kiểm tra lại");
                        flag = false;
                    }
                    else
                    {
                        flag = true;
                    }
                }
            }

            return flag;
        }

        #endregion

        #region Insert

        protected override void Insert()
        {
            var context = new Context();

            var roleBiz = new RoleBiz(context);
            var userBiz = new UserBiz(context);

            var model = new Model.User
                            {
                                Username = txtUsername.Text,
                                FullName = txtFullName.Text,
                                Password = Utilities.EncodePassword(Constant.DefaultPassword)
                            };

            foreach (string roleName in cblRoles.CheckedItems)
            {
                model.Roles.Add(roleBiz.GetRoleByName(roleName));
            }

            userBiz.Insert(model);
        }

        #endregion

        private void LoadRoles()
        {
            var roleBiz = new RoleBiz();
            foreach (var role in roleBiz.GetAll())
            {
                cblRoles.Items.Add(role.RoleName);
            }
        }

        protected override void Edit()
        {
            var context = new Context();

            var userBiz = new UserBiz(context);
            var roleBiz = new RoleBiz(context);

            var model = (Model.User) userBiz.GetItemById(userId);

            model.Username = txtUsername.Text;
            model.FullName = txtFullName.Text;

            model.Roles.Clear();
            foreach (string roleName in cblRoles.CheckedItems)
            {
                model.Roles.Add(roleBiz.GetRoleByName(roleName));
            }
            userBiz.Update(model);
        }
    }
}